package com.ali.gts.servlet.util;

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;



/*
 * 操作数据的帮助类
 */
public final class JDBCUtils {

	private static DataSource dataSource = new ComboPooledDataSource("webDataSource");
    //使用ThreadLocal 来保证所有的操作都使用同一个Connection 来实现事物的管理。
	private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();


	/*
	 * 获取连接 这个是不用ThreadLocal 时获取连接的方式
	 */
//	public static Connection getConnection() {
//		Connection conn = null;
//		try {
//			conn = dataSource.getConnection();
//		} catch (SQLException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
//		return conn;
//	}




	/*
	 * 获取连接
	 */
	public static Connection getConnection() {
		Connection conn = threadLocal.get();
		if(conn == null){
			try {
				conn = dataSource.getConnection();
				conn.setAutoCommit(false); //需要手动提交事务
				threadLocal.set(conn);
			} catch (SQLException throwables) {
				throwables.printStackTrace();
			}
		}
		return conn;
	}

	//提交并关闭事务,在自定义的事物过滤器里面调用该方法
	public static void commitAndClose(){

		Connection connection = threadLocal.get();
		if (connection != null){ //如果不是null 说明之前使用过连接，操作过数据库
			try {
				connection.commit();

			} catch (SQLException throwables) {
				throwables.printStackTrace();
			}finally {
				try {
					connection.close();
				} catch (SQLException throwables) {
					throwables.printStackTrace();
				}
			}
		}
        //这里一定要执行remove操作 否则会出错(因为tomcat底层使用了线程池技术)
		threadLocal.remove();

	}

    //回滚并提交事务在自定义的事物过滤器里面调用该方法
	public static void robackAndClose(){
		Connection connection = threadLocal.get();
		if (connection != null){ //如果不是null 说明之前使用过连接，操作过数据库
			try {
				connection.rollback();

			} catch (SQLException throwables) {
				throwables.printStackTrace();
			}finally {
				try {
					connection.close();
				} catch (SQLException throwables) {
					throwables.printStackTrace();
				}
			}
		}
		//这里一定要执行remove操作 否则会出错
		threadLocal.remove();
	}




	/*
	 * 释放连接,不实用threadlocal时用的
	 */
//	public static void releaseConn(Connection conn) {
//		if(conn!=null) {
//			try {
//				conn.close();
//			} catch (SQLException e) {
//				// TODO Auto-generated catch block
//				e.printStackTrace();
//			}
//		}
//	}
}
